/************
//
//此程序之爬取固定网页地数据。
//
//
**************/
package comm

import (
	"fmt"
	"os"
	"strings"

	"github.com/gocolly/colly"
)

func GetImageAsync() {
	//设置UA 告诉服务器我不是爬虫。>_<
	ua := "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19042"
	//主页URL，
	homeUrl := "https://www.umei.cc"
	//路径参数，可以根据需要下载主页不同分区地图片
	indexPath := "/bizhitupian"

	for i := 1; i <= 500; i++ {
		realUrl := "" //真正访问地URL，for循环，自动爬取前i页的图片。
		if i == 1 {
			realUrl = fmt.Sprint(homeUrl, indexPath) //第一页的地址没有没有index参数项，省略它。
		} else {
			realUrl = fmt.Sprint(homeUrl, indexPath, "/index_", i, ".htm") //第二页之后变成了“https://www.umei.cc/{indexPath}/index_{i}.htm”
		}
		fmt.Println("Opening", realUrl)
		openUrlAsync(realUrl, ua) //调用函数访问URL。爬区图片
	}

}

///爬取图片地住函数，url， ua两个参数。
func openUrlAsync(url, ua string) {
	c1 := colly.NewCollector(
		colly.UserAgent(ua),
		colly.Async(true),
	)
	/// limit 方法设置规则，Parallelisx表示最大并发为5
	c1.Limit(&colly.LimitRule{Parallelism: 5})
	c1.OnHTML("div[class=TypeList]>ul a", func(h *colly.HTMLElement) {
		href := h.Attr("href")
		imageUrl := fmt.Sprint(url[:19], href)
		///访问imageUrl
		h.Request.Visit(imageUrl)
	})

	c1.OnHTML("div[class=ImageBody] img", func(h *colly.HTMLElement) {
		imageSrc := h.Attr("src")
		//访问imageSrc
		h.Request.Visit(imageSrc)
	})
	c1.OnResponse(func(r *colly.Response) {
		fileName := fmt.Sprint("./image/", r.FileName())
		//判断字符串是否以特定字符（开头）结尾，用strings.Has(Pro)SufFix.
		//如果是以“.jpg”结尾，则保存提片。
		if strings.HasSuffix(fileName, ".jpg") {
			f, err := os.Create(fileName)
			if err != nil {
				fmt.Printf("%s/n", err)
			}
			defer f.Close()
			fmt.Println("Dowloading ", fileName)
			f.Write(r.Body)
		}
	})

	c1.OnError(func(r *colly.Response, e error) {
		fmt.Println("Visiting ", r.Request.URL, "  ", e)
	})
	err := c1.Visit(url)
	if err != nil {
		fmt.Println(err)
	}
	c1.Wait() //因为开启了并发要用Wait方法。
}
